﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entities;
using AccesoDatos;
using LogicaNegocio;

namespace Presentacion.Ventas
{
    public partial class Ventas : System.Web.UI.Page
    {
        private static DateTime fechaHoraFactura;
        private static Cliente c;
        private static List<Detalle_Factura> lstItemsFactura = new List<Detalle_Factura>();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {
                    if (lstItemsFactura == null) lstItemsFactura = new List<Detalle_Factura>();
                    Page.Title = "Ventas";
                    txtFechaEmisión.Enabled = false;
                    if (Session["FechaFactura"] == null)
                    {
                        fechaHoraFactura = DateTime.Now;
                        Session["FechaFactura"] = fechaHoraFactura;
                    }
                    txtFechaEmisión.Text = fechaHoraFactura.ToString();
                    txtDescripcionProducto.Enabled = false;
                    txtCliente.Enabled = false;
                    txtProducto.Enabled = false;
                    txtTotal.Enabled = false;
                    btnAceptar.Enabled = false;
                    if (Session["ProdSelect"] != null)
                        cargarProductoElegido();
                    if (Session["ClienteSelect"] != null)
                        cargarClienteElegido();
                    if (Session["ListaDF"] != null)
                    {
                        grdDetalleFactura.DataSource = (List<Detalle_Factura>)Session["ListaDF"];
                        grdDetalleFactura.DataBind();
                    }
                }
                catch (Exception ex)
                {
                    lblMensajeError.Text = ex.Message;
                }
                //txtFechaEmisión.Enabled = false;
                //if (Session["FechaFactura"] == null)
                //{
                //    fechaHoraFactura = DateTime.Now;
                //    Session["FechaFactura"] = fechaHoraFactura;
                //}
                //txtFechaEmisión.Text = fechaHoraFactura.ToString();
                //txtDescripcionProducto.Enabled = false;
                //txtCliente.Enabled = false;
                //txtProducto.Enabled = false;
                //txtTotal.Enabled = false;
                //btnAceptar.Enabled = false;
                //if (Session["ProdSelect"] != null)
                //    cargarProductoElegido();
                //if (Session["ClienteSelect"] != null)
                //    cargarClienteElegido();
                //if (Session["ListaDF"] != null)
                //{
                //    grdDetalleFactura.DataSource = (List<Detalle_Factura>)Session["ListaDF"];
                //    grdDetalleFactura.DataBind();
                //}
            }
            Page.Title = "Ventas";
        }

        private void cargarClienteElegido()
        {
            try
            {
                c = (Cliente)Session["ClienteSelect"];
                txtCliente.Text = c.Nombre + " " + c.Apellido;
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
            //c = (Cliente)Session["ClienteSelect"];
            //txtCliente.Text = c.Nombre + " " + c.Apellido;
        }

        private void cargarProductoElegido()
        {
            try
            {
                Producto p = (Producto)Session["ProdSelect"];
                txtProducto.Text = p.Nombre;
                txtDescripcionProducto.Text = p.ToString();
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
            //Producto p = (Producto)Session["ProdSelect"];
            //txtProducto.Text = p.Nombre;
            //txtDescripcionProducto.Text = p.ToString();
        }

        protected void btnAgregarProducto_Click(object sender, EventArgs e)
        {
            try
            {
                int cantidad = 0;
                Producto p = (Producto)Session["ProdSelect"];

                if (p == null)
                    lblErrorDetalle.Text = "No se ha seleccionado producto";
                else if (validarCantidad())
                {
                    cantidad = Convert.ToInt32(txtCantidad.Text);
                    if (p.Stock >= cantidad)
                    {
                        Detalle_Factura df = new Detalle_Factura();
                        df.IdProducto = p.IdProducto;
                        df.PrecioUnitario = p.PrecioUnitario;
                        df.Cantidad = cantidad;
                        df.Subtotal = cantidad * p.PrecioUnitario;
                        df.NombreProducto = p.Nombre;
                        lstItemsFactura.Add(df);
                        if (lstItemsFactura != null && lstItemsFactura.Count > 0)
                            Session["listaDF"] = lstItemsFactura;
                        grdDetalleFactura.DataSource = lstItemsFactura;
                        grdDetalleFactura.DataBind();

                        ////descontamos cantidad a producto seleccionado (?)
                        //p.Stock -= cantidad;
                        //Session["prodSelect"] = p;

                        //calculo del total
                        double total = 0;
                        foreach (Detalle_Factura detalle in lstItemsFactura)
                        {
                            total += detalle.Subtotal;
                        }
                        txtTotal.Text = total.ToString();
                        btnAceptar.Enabled = true;
                    }
                    else
                        lblErrorCantidad.Text = "La cantidad ingresada es mayor que el stock disponible del producto";
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }

            //int cantidad = 0;
            //Producto p = (Producto)Session["ProdSelect"];

            //if (p == null)
            //    lblErrorDetalle.Text = "No se ha seleccionado producto";
            //else if (validarCantidad())
            //{
            //    cantidad = Convert.ToInt32(txtCantidad.Text);
            //    if (p.Stock >= cantidad)
            //    {
            //        Detalle_Factura df = new Detalle_Factura();
            //        df.IdProducto = p.IdProducto;
            //        df.PrecioUnitario = p.PrecioUnitario;
            //        df.Cantidad = cantidad;
            //        df.Subtotal = cantidad * p.PrecioUnitario;
            //        df.NombreProducto = p.Nombre;
            //        lstItemsFactura.Add(df);
            //        if (lstItemsFactura != null && lstItemsFactura.Count > 0)
            //            Session["listaDF"] = lstItemsFactura;
            //        grdDetalleFactura.DataSource = lstItemsFactura;
            //        grdDetalleFactura.DataBind();

            //        ////descontamos cantidad a producto seleccionado (?)
            //        //p.Stock -= cantidad;
            //        //Session["prodSelect"] = p;

            //        //calculo del total
            //        double total = 0;
            //        foreach (Detalle_Factura detalle in lstItemsFactura){
            //            total += detalle.Subtotal;
            //        }
            //        txtTotal.Text = total.ToString();
            //        btnAceptar.Enabled = true;
            //    }
            //    else
            //        lblErrorCantidad.Text = "La cantidad ingresada es mayor que el stock disponible del producto";
            //}
        }

        private bool validarCantidad()
        {
            if (String.IsNullOrEmpty(txtCantidad.Text))
            {
                lblErrorCantidad.Text = "La cantidad es un valor requerido";
                return false;
            }
            else
            {
                int cantidad = 0;
                Producto prod = (Producto)Session["ProdSelect"];
                bool resultado = int.TryParse(txtCantidad.Text, out cantidad);
                if (resultado == false)
                {
                    lblErrorCantidad.Text = "La cantidad debe ser un valor numérico entero";
                    return resultado;
                }
                else if (cantidad <= 0)
                {
                    lblErrorCantidad.Text = "La cantidad debe ser un valor numérico mayor que cero";
                    return false;
                }
                else
                    return true;
            }
        }

        protected void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Productos/ConsultarProductos.aspx?op=buscar");
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (validarFactura())
                {
                    //creamos factura
                    Factura fact = new Factura();
                    fact.IdCliente = c.IdCliente;
                    fact.FechaEmision = Convert.ToDateTime(txtFechaEmisión.Text);
                    fact.IdEstadoFactura = 1;

                    GestorFacturas gf = new GestorFacturas();
                    int filasAfectadas = 0;
                    gf.registrarFactura(fact, lstItemsFactura, out filasAfectadas);

                    if (filasAfectadas > 0)
                    {
                        Session["ProdSelect"] = null;
                        Session["ClienteSelect"] = null;
                        Session["ListaDF"] = null;
                        lblResultado.ForeColor = System.Drawing.Color.Green;
                        lblResultado.Text = "Se ha registrado exitosamente la factura";
                        txtCantidad.Text = string.Empty;
                        txtCliente.Text = string.Empty;
                        txtDescripcionProducto.Text = string.Empty;
                        txtFechaEmisión.Text = string.Empty;
                        txtProducto.Text = string.Empty;
                        txtTotal.Text = string.Empty;
                        lstItemsFactura = null;
                        btnBuscarCliente.Enabled = false;
                        btnBuscarProducto.Enabled = false;
                        txtCantidad.Enabled = false;
                        txtDescripcionProducto.Enabled = false;
                        btnAgregarProducto.Enabled = false;
                        btnAceptar.Enabled = false;

                    }
                    else
                    {
                        lblResultado.ForeColor = System.Drawing.Color.Red;
                        lblResultado.Text = "No se ha podido registrar la factura";
                    }
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }

            //if (validarFactura())
            //{
            //    //creamos factura
            //    Factura fact = new Factura();
            //    fact.IdCliente = c.IdCliente;
            //    fact.FechaEmision = Convert.ToDateTime(txtFechaEmisión.Text);
            //    fact.IdEstadoFactura = 1;

            //    GestorFacturas gf = new GestorFacturas();
            //    int filasAfectadas = 0;
            //    gf.registrarFactura(fact, lstItemsFactura, out filasAfectadas);

            //    if (filasAfectadas > 0)
            //    {
            //        Session["ProdSelect"] = null;
            //        Session["ClienteSelect"] = null;
            //        Session["ListaDF"] = null;
            //        lblResultado.ForeColor = System.Drawing.Color.Green;
            //        lblResultado.Text = "Se ha registrado exitosamente la factura";
            //        txtCantidad.Text = string.Empty;
            //        txtCliente.Text = string.Empty;
            //        txtDescripcionProducto.Text = string.Empty;
            //        txtFechaEmisión.Text = string.Empty;
            //        txtProducto.Text = string.Empty;
            //        txtTotal.Text = string.Empty;
            //        lstItemsFactura = null;
            //        btnBuscarCliente.Enabled = false;
            //        btnBuscarProducto.Enabled = false;
            //        txtCantidad.Enabled = false;
            //        txtDescripcionProducto.Enabled = false;
            //        btnAgregarProducto.Enabled = false;
            //        btnAceptar.Enabled = false;

            //    }
            //    else
            //    {
            //        lblResultado.ForeColor = System.Drawing.Color.Red;
            //        lblResultado.Text = "No se ha podido registrar la factura";
            //    }
            //}
            
        }

        private bool validarFactura()
        {
            if (String.IsNullOrEmpty(txtCliente.Text))
            {
                lblErrorCliente.Text = "No se ha ingresado cliente";
                return false;
            }
            else if (lstItemsFactura.Count == 0)
            {
                lblErrorDetalle.Text = "No hay productos en el detalle de factura";
                return false;
            }
            else
                return true;
        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Clientes/ConsultarClientes.aspx?op=buscar");
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default.aspx");
        }
    }
}